/*
 * @Description: 函数重载 overload 
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-05-06 17:09:54
 * @LastEditTime: 2021-05-17 21:58:18
 */

/**
 * 定义：函数名相同，函数的参数及个数不同或返回值不同
 * 用途：为同一个函数提供多种输入或输出方式
 */

(function () {

    /**
     * 需求：定义一个add函数，可以接收两个字符串进行拼接，也可以两个数字求和
     */

    /* 
        // 传统思路是会报错的，因为不能同时传一个number和一个string
        function add(x: string | number, y: string | number): string | number {
            return x + y // 报错：运算符“+”不能应用于类型“string | number”和“string | number”
        } 
    */

    /**
     * 使用函数重载方式进行实现
     */

    // 重载签名
    function add(x: string, y: string): string
    function add(x: number, y: number): number

    // 重载实现
    function add(x: string | number, y: string | number) {
        if (typeof x == "string" && typeof y == "string") {
            return x + " " + y
        } else if (typeof x == "number" && typeof y == "number") {
            return x + y
        }
    }

    console.log(add(5, 5))  // 10
    console.log(add("Hello", "World")) // Hello World
    // console.log(add("Hello", 5))    // 报错：没有与此调用匹配的重载。


    /**
     * 使用接口实现重载
     */
    interface iAdd {
        (x: string, y: string): string
        (x: number, y: number): number
    }

    const add2: iAdd = function (x: any, y: any) {
        return x + y
    }

    console.log(add2(2, 5))  // 7
    console.log(add2("Hello", "World2")) // Hello World2
    // console.log(add2(5, "ewq")) // 报错：没有与此调用匹配的重载。
})()

